@file:JvmName("Libyuv") // 生成的 Java 类名为 Libyuv，不再是 LibyuvKt，Kotlin中直接调用方法名，Java中用Libyuv + 方法名

package cn.android666.libyuv

fun initLibrary() {
    System.loadLibrary("yuv_util")
}

/*
external 修饰的为 native 方法。
Libyuv库中最常用的yuv格式是I420，所以我们平时应该设置Camera输出格式为：ImageFormat.YV12，
I420也叫 YU12，YV12格式和YU12格式基本一样，只是UV位置相反，YU12 为 UUUVVV，YV12 为 VVVUUU，
所以，对于旋转、缩放、裁切、镜像等功能，直接把YV12当成I420丢给Libyuv的相关函数即可，不需要先把YV12转为I420。
即使跟UV顺序有关系，YV12也可以当I420用的，比如YV12转NV21，我们可以使用I420ToNV21函数，因为C里面是有指针的，
所以，只要把I420ToNV21函数中需要的U分量的指针指到YV12数据中的V分量，把I420ToNV21函数中需要的V分量的指针指到YV12数据中的U分量即可。
 */

/**
 * yv12 转 i420，即: vvvuuu -> uuuvvv，i420转yv12也可以用这个函数，因为只是交换UV位置，函数执行是一样的
 * @param yv12Bytes yv12数据
 * @param i420Bytes 用于保存转换后的i420数据
 * @param width 图像宽
 * @param height 图像高
 */
external fun yv12ToI420(yv12Bytes: ByteArray, i420Bytes: ByteArray, width: Int, height: Int)

/**
 * yv12 转 nv21，i420转nv12也可以用这个函数，函数执行是一样的
 * @param yv12Bytes yv12数据
 * @param nv21Bytes 用于保存转换后的nv21数据
 * @param width 图像宽
 * @param height 图像高
 */
external fun yv12ToNv21(yv12Bytes: ByteArray, nv21Bytes: ByteArray, width: Int, height: Int)

/**
 * nv21 转 nv12，即: vuvu -> uuvv，nv21转nv12也可以用这个函数，因为只是交换UV位置，函数执行是一样的
 * @param nv21Bytes yv12数据
 * @param nv12Bytes 用于保存转换后的nv12数据
 * @param width 图像宽
 * @param height 图像高
 */
external fun nv21ToNv12(nv21Bytes: ByteArray, nv12Bytes: ByteArray, width: Int, height: Int)

/**
 * yv12 旋转，结果还是yv12格式，支持90、180、270度，因为和I420的只是UV相反，所以也可以用于旋转I420
 * @param yv12Bytes yv12数据
 * @param resultBytes 用于保存旋转后的数据，结果依旧是yv12
 * @param width 图像宽
 * @param height 图像高
 * @param rotation 指定旋转角度，支持90、180、270
 */
external fun yv12Rotate(yv12Bytes: ByteArray, resultBytes: ByteArray, width: Int, height: Int, rotation: Int)

/**
 * yv12 旋转，结果是nv21格式，支持90、180、270度，因为和I420的只是UV相反，所以也可以用于旋转I420
 * @param yv12Bytes yv12数据
 * @param resultBytes 用于保存旋转后的数据，结果是NV21数据
 * @param tempBytes 临时数据，用于保存旋转后的数据，此时格式还是yv12，最后再把yv12转换为nv21保存到resultBytes中
 * @param width 图像宽
 * @param height 图像高
 * @param rotation 指定旋转角度，支持90、180、270
 */
external fun yv12RotateToNv21(yv12Bytes: ByteArray, resultBytes: ByteArray, tempBytes: ByteArray, width: Int, height: Int, rotation: Int)